// hdu5710
// 题意：
// 定义S(n)为n的每位数字之和，给定a, b(1<a, b<101)，问使得
//   a*S(n) = b*S(2*n)
// 成立的最小的n是多少，如果没有输出0。
//
// 题解：
// 这道题关键是找到S(2n)和S(n)的关系，我们可以按位考虑：
// 如果某一位上数字x是属于[0, 4]，那么2倍这个数字的值会全部被贡献到和里，
// 及贡献值为2x；
// 如果某一位上数字x是属于[5, 9]，那么2倍这个数字的值不会全部被贡献进去，
// 事实上只贡献了2x-9，因为10只算做1（进位）。
//
// 那么我们假设那个数n有l位是大于等于5的，我们可以得到
//  S(2n)=2*S(n) - 9*l，那么根据a, b我们就可以得到l和S(n)的关系。
//
// 这个关系就是 S(n) = 9bl/(2b - a)，于是乎我们可以枚举l来算S(n)，再去构造答案。
//
// 其实我们不用这么麻烦去枚举，只需要取l为最小的使得S(n)是整数的就行，
// 为什么你可以稍后自己想一下，我们先说怎么构造答案。
//
// 对于l位我们先假设全是5, 贪心，把这些全部放最低位，如果S(n)比9*l还大，
// 说明除了l位大于4的数还需要一些小于等于4的数才能凑齐S(n)，怎么凑？
// 也是利用贪心，不断先用4去凑。如果S(n)一开始就比5*l小，说明肯定是无解的。
//
// 这么构造就可以构造出解，回答下刚刚l的问题，如果l比我们取的数大，
// 构造出来的n无论怎么看也都是更大的。
//
// 另外还有一些边界，当 2*b == a 是答案是1, 2*b < a 时，无解。
//
// run: $exec < input
#include <iostream>

int a, b;

int gcd(int a, int b) { return !b ? a : gcd(b, a % b); }

std::string small(int sum, int len)
{
	int r = sum - 5 * len;
	std::string ret(len, '5');
	for (int i = len - 1; i >= 0 && r > 0; i--) {
		ret[i] += std::min(4, r);
		r -= std::min(4, r);
	}
	return ret;
}

std::string check_small(int sum, int len)
{
	int big = sum - 9 * len;
	std::string ret(big / 4, '4');
	if (big % 4) ret = char('0' + big % 4) + ret;
	return ret + std::string(len, '9');
}

int main()
{
	std::ios::sync_with_stdio(false);
	int T; std::cin >> T;
	while (T--) {
		std::cin >> a >> b;
		if (2 * b == a) { std::cout << "1\n"; continue; }
		if (2 * b < a) { std::cout << "0\n"; continue; }
		int t = gcd(a, b);
		a /= t; b /= t;
		for (int l = 1; l <= 10000; l++) {
			if ((9 * b * l) % (2 * b - a)) continue;
			int sum = (9 * b * l) / (2 * b - a);
			if (sum < l * 5) {
				std::cout << "0\n";
				break;
			}
			if (9 * l >= sum) std::cout << small(sum, l) << "\n";
			else std::cout << check_small(sum, l) << "\n";
			break;
		}
	}
}

